package br.com.gemepde.control;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.Serializable;
import java.io.UnsupportedEncodingException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;

import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;
import org.primefaces.model.UploadedFile;

import br.com.gemepde.domain.Arquivo;
import br.com.gemepde.domain.TipoArquivo;
import br.com.gemepde.utils.FileController;

@ManagedBean
@SessionScoped
public class ArquivoBean implements Serializable{
	
	private static final long serialVersionUID = 5968813931203077971L;
	
	//AVATAR
	private String nomeArquivoAvatar;
	private Arquivo arquivoAvatar;
	private UploadedFile uploadFileAvatar;
	private StreamedContent streamContentAvatar;
	private boolean contemAvatar = false;

	//OBSERVAÇÃO
	private String nomeArquivoObservacao;
	private UploadedFile uploadFileObservacao;
	private Arquivo arquivoObs;
	private List<Arquivo> listaArquivosObservacao = new ArrayList<Arquivo>();
	
	//INFORMAÇÃO
	private String nomeArquivoInformacao;
	private UploadedFile uploadFileInformacao;
	private Arquivo arquivoInfo;
	private List<Arquivo> listaArquivosInformacao = new ArrayList<Arquivo>();
	
	public ArquivoBean() {
		nomeArquivoAvatar = "";
		arquivoAvatar = new Arquivo();
		streamContentAvatar = null;
//		nomeArquivoObservacao = "";
//		arquivoObs = new Arquivo();
//		listaArquivosObservacao.clear();
//		nomeArquivoInformacao = "";
//		arquivoInfo = new Arquivo();
//		listaArquivosInformacao.clear();
	}
	
	public String avancarObservacoes(){
		nomeArquivoObservacao = "";
		arquivoObs = new Arquivo();
		listaArquivosObservacao.clear();
		nomeArquivoInformacao = "";
		arquivoInfo = new Arquivo();
		listaArquivosInformacao.clear();
		return "cadastroUploads";
	}

	//METODOS PARA AVATAR
	public void handleFileUploadAvatar(){
		
		FacesMessage msg;
		String extensao = uploadFileAvatar.getFileName().toString();
		int tamanho = extensao.length();
		
		if(!extensao.equals("")){
			extensao = extensao.substring(tamanho-4, tamanho);
		}
		
		if(extensao.equals(".jpg")||extensao.equals(".png")||extensao.equals(".gif")){
			
			try {
				salvarAvatar();
				
				msg = new FacesMessage("Foto salva com sucesso", "SUCCESS MSG");
				msg.setSeverity(FacesMessage.SEVERITY_INFO);
			} catch (IOException e) {
				e.printStackTrace();
				msg = new FacesMessage("Não foi possível salvar a imagem", "ERROR MSG");
		        msg.setSeverity(FacesMessage.SEVERITY_ERROR);
			}
		}else{
			msg = new FacesMessage("Formato de arquivo não suportado", "ERROR MSG");
	        msg.setSeverity(FacesMessage.SEVERITY_ERROR);
		}
		
		FacesContext.getCurrentInstance().addMessage(null, msg);
	}
	
	public String salvarAvatar() throws IOException{
		
		streamContentAvatar = new DefaultStreamedContent(uploadFileAvatar.getInputstream());
		arquivoAvatar.setNome(uploadFileAvatar.getFileName().toString());
		arquivoAvatar.setTipo(TipoArquivo.FOTO);
		arquivoAvatar.setImagem(uploadFileAvatar.getContents());
		
		contemAvatar = true;
		
		ServletContext servlet = (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext();
		servlet.setAttribute("arquivoAvatar", arquivoAvatar);
		
		return "";
	}
	
	public StreamedContent getStreamContentAvatar() {
		if (arquivoAvatar.getImagem()!=null){
			streamContentAvatar = new DefaultStreamedContent(new ByteArrayInputStream(arquivoAvatar.getImagem()));
		}
		return streamContentAvatar;
	}

	//METODOS PARA OBSERVAÇÃO
	public void handleFileUploadObservacao(){
		
		String extensao = uploadFileObservacao.getFileName().toString();
		int tamanho = extensao.length();
		
		if(!extensao.equals("")){
			extensao = extensao.substring(tamanho-4, tamanho);
		}
		
		if(extensao.equals(".jpg")||extensao.equals(".png")||extensao.equals(".gif")||extensao.equals(".pdf")){
			
			try {

				if(nomeArquivoObservacao == null || nomeArquivoObservacao.equals("")){
					nomeArquivoObservacao = "Sem nome";
				}
				
				nomeArquivoObservacao = new String(nomeArquivoObservacao.getBytes ("iso-8859-1"), "UTF-8");
				
				arquivoObs.setNome(nomeArquivoObservacao);
				arquivoObs.setTipo(TipoArquivo.OBSERVACAO);
				arquivoObs.setImagem(uploadFileObservacao.getContents());
				
				listaArquivosObservacao.add(arquivoObs);
				
				ServletContext servlet = (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext();
				servlet.setAttribute("listaArquivosObservacao", listaArquivosObservacao);

				FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Imagem " + nomeArquivoObservacao + " salva com sucesso", ""));

				arquivoObs = new Arquivo();
				nomeArquivoObservacao = "";
				
			} catch (UnsupportedEncodingException ex) {
				System.out.println(ex.getMessage());
				FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"Não foi possível salvar imagem: " + nomeArquivoObservacao + ".", ""));
			}
			
		}else{
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"Formato de arquivo não suportado.", ""));
		}
	}
	
	public void removerArquivoObservacao(){
		try {
			HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
			arquivoObs = (Arquivo) request.getAttribute("arquivo");
			nomeArquivoObservacao = arquivoObs.getNome();
			
			listaArquivosObservacao.remove(arquivoObs);
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Imagem " + nomeArquivoObservacao + " removida com sucesso", ""));

			nomeArquivoObservacao = "";
			
			ServletContext servlet = (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext();
			servlet.setAttribute("listaArquivosObservacao", listaArquivosObservacao);
			
		} catch (Exception e) {
			e.printStackTrace();
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"Não foi possível salvar imagem: " + nomeArquivoObservacao + ".", ""));
		}
//		return "";
	}
	
	//METODOS PARA INFORMAÇÃO
	public void handleFileUploadInformacao(){
		String extensao = uploadFileInformacao.getFileName().toString();
		int tamanho = extensao.length();
		if(!extensao.equals("")){
			extensao = extensao.substring(tamanho-4, tamanho);
		}
		
		if(extensao.equals(".jpg")||extensao.equals(".png")||extensao.equals(".gif")||extensao.equals(".pdf")){
			
			long tempo = System.currentTimeMillis();
	        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
	        Date resultdate = new Date(tempo);
	        
			String caminhoPasta = "informacao/"  + sdf.format(resultdate);
			FileController fileUpload = new FileController();

			arquivoInfo = new Arquivo();
			arquivoInfo.setTipo(TipoArquivo.INFORMACAO);
			arquivoInfo.setCaminho(fileUpload.lerArquivo(uploadFileInformacao,"", caminhoPasta));
			arquivoInfo.setImagem(uploadFileInformacao.getContents());
			
			fileUpload = null;
			
			salvarInformacao();
			
		}else{
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"Formato de arquivo não suportado.", ""));
		}
	}
	
	public String salvarInformacao(){
		try {

			if(nomeArquivoInformacao == null || nomeArquivoInformacao.equals("")){
				nomeArquivoInformacao = "Sem nome";
			}
			
			nomeArquivoInformacao = new String(nomeArquivoInformacao.getBytes ("iso-8859-1"), "UTF-8");
			
			arquivoInfo.setNome(nomeArquivoInformacao);
			nomeArquivoInformacao = "";
			
			listaArquivosInformacao.add(arquivoInfo);
			
			ServletContext servlet = (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext();
			servlet.setAttribute("listaArquivosInformacao", listaArquivosInformacao);
			
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Imagem " + nomeArquivoInformacao + " salva com sucesso", ""));
	
		} catch (Exception e) {
			e.printStackTrace();
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"Não foi possível salvar imagem:  " + nomeArquivoInformacao + ".", ""));
		}
		return "";
	}
	
	public void removerArquivoInformacao(){
		try {
			HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
			arquivoInfo = (Arquivo) request.getAttribute("arquivo");
			nomeArquivoInformacao = arquivoInfo.getNome();
			
			listaArquivosInformacao.remove(arquivoInfo);
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,"Imagem " + nomeArquivoInformacao + " removida com sucesso", ""));

			nomeArquivoObservacao = "";
			
			ServletContext servlet = (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext();
			servlet.setAttribute("listaArquivosInformacao", listaArquivosInformacao);
			
		} catch (Exception e) {
			e.printStackTrace();
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"Não foi possível salvar imagem:  " + nomeArquivoObservacao + ".", ""));
		}
//		return "";
	}

	public String getNomeArquivoAvatar() {
		return nomeArquivoAvatar;
	}

	public void setNomeArquivoAvatar(String nomeArquivoAvatar) {
		this.nomeArquivoAvatar = nomeArquivoAvatar;
	}

	public Arquivo getArquivoAvatar() {
		return arquivoAvatar;
	}

	public void setArquivoAvatar(Arquivo arquivoAvatar) {
		this.arquivoAvatar = arquivoAvatar;
	}

	public UploadedFile getUploadFileAvatar() {
		return uploadFileAvatar;
	}

	public void setUploadFileAvatar(UploadedFile uploadFileAvatar) {
		this.uploadFileAvatar = uploadFileAvatar;
	}

	public boolean isContemAvatar() {
		return contemAvatar;
	}

	public void setContemAvatar(boolean contemAvatar) {
		this.contemAvatar = contemAvatar;
	}

	public String getNomeArquivoObservacao() {
		return nomeArquivoObservacao;
	}

	public void setNomeArquivoObservacao(String nomeArquivoObservacao) {
		this.nomeArquivoObservacao = nomeArquivoObservacao;
	}

	public UploadedFile getUploadFileObservacao() {
		return uploadFileObservacao;
	}

	public void setUploadFileObservacao(UploadedFile uploadFileObservacao) {
		this.uploadFileObservacao = uploadFileObservacao;
	}

	public Arquivo getArquivoObs() {
		return arquivoObs;
	}

	public void setArquivoObs(Arquivo arquivoObs) {
		this.arquivoObs = arquivoObs;
	}

	public List<Arquivo> getListaArquivosObservacao() {
		return listaArquivosObservacao;
	}

	public void setListaArquivosObservacao(List<Arquivo> listaArquivosObservacao) {
		this.listaArquivosObservacao = listaArquivosObservacao;
	}

	public String getNomeArquivoInformacao() {
		return nomeArquivoInformacao;
	}

	public void setNomeArquivoInformacao(String nomeArquivoInformacao) {
		this.nomeArquivoInformacao = nomeArquivoInformacao;
	}

	public UploadedFile getUploadFileInformacao() {
		return uploadFileInformacao;
	}

	public void setUploadFileInformacao(UploadedFile uploadFileInformacao) {
		this.uploadFileInformacao = uploadFileInformacao;
	}

	public Arquivo getArquivoInfo() {
		return arquivoInfo;
	}

	public void setArquivoInfo(Arquivo arquivoInfo) {
		this.arquivoInfo = arquivoInfo;
	}

	public List<Arquivo> getListaArquivosInformacao() {
		return listaArquivosInformacao;
	}

	public void setListaArquivosInformacao(List<Arquivo> listaArquivosInformacao) {
		this.listaArquivosInformacao = listaArquivosInformacao;
	}

	public void setStreamContentAvatar(StreamedContent streamContentAvatar) {
		this.streamContentAvatar = streamContentAvatar;
	}
	
}
